package com.example.controller;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.example.common.Result;
import com.example.entity.Category;
import com.example.entity.Introduction;
import com.example.entity.User;
import com.example.service.CategoryService;
import com.example.service.IntroductionService;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/echarts")
public class EchartsController {
    @Autowired
    private CategoryService categoryService;
    @Autowired
    private IntroductionService introductionService;
    @Autowired
    private UserService userService;

    @GetMapping("/pie")
    public Result pie(){
        List<Map<String, Object>> list=new ArrayList<>();
        List<Category> categories=categoryService.selectAll(new Category());
        List<Introduction> introductions=introductionService.selectAll(new Introduction());
        for (Category category : categories) {
            long count = introductions.stream().filter(x -> category.getId().equals(x.getCategoryId())).count();
            Map<String,Object>map=new HashMap<>();
            map.put("name",category.getTitle());
            map.put("value",count);
            list.add(map);
        }
        return Result.success(list);
    }

    @GetMapping("/bar")
    public Result bar(){

        Map<String,Object> resultMap=new HashMap<>();
        List<String> xList=new ArrayList<>();
        List<Long> yList=new ArrayList<>();

        Map<String,Long> map=new HashMap<>();

        List<User> users = userService.selectAll(new User());
        List<Introduction> introductions = introductionService.selectAll(new Introduction());

        for (User user : users) {
            long count = introductions.stream().filter(x -> user.getId().equals(x.getUserId())).count();
            map.put(user.getName(),count);
        }

//        降序
        LinkedHashMap<String, Long> collectMap = map.entrySet().stream()
                .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

        for(String key:collectMap.keySet()){
            xList.add(key);
            yList.add(collectMap.get(key));
        }

        if(xList.size()>5&&yList.size()>5){
            xList=xList.subList(0,5);
            yList=yList.subList(0,5);
        }

        resultMap.put("xAxis",xList);
        resultMap.put("yAxis",yList);
        return Result.success(resultMap);

    }

    @GetMapping("/line")
    public Result line(){

        Map<String,Object> resultMap=new HashMap<>();
        List<Long> yList=new ArrayList<>();

//        //获取最近多少天的年月日
//        Date today=new Date();
//        DateTime start= DateUtil.offsetDay(today,-7);
//        List<String> xList=DateUtil.rangeToList(start,today, DateField.DAY_OF_YEAR).stream().map(DateUtil::formatDate).toList();
//
//        List<Introduction> introductions = introductionService.selectAll(new Introduction());
//
//        for (String day : xList) {
//            long count = introductions.stream().filter(x -> ObjectUtil.isNotEmpty(x.getTime()) && x.getTime().contains(day)).count();
//            yList.add(count);
//        }
//
//
//        resultMap.put("xAxis",xList);
//        resultMap.put("yAxis",yList);
//        return Result.success(resultMap);

        // 获取当前日期
        Date today = new Date();
        // 使用 DateUtil 工具类计算 7 天前的日期
        DateTime start = DateUtil.offsetDay(today, -7);
        // 使用 DateUtil 工具类生成从 7 天前到今天的日期列表
        // DateUtil.rangeToList 方法生成日期范围列表，然后通过流操作将每个日期格式化为 "yyyy-MM-dd" 格式的字符串
        List<String> xList = DateUtil.rangeToList(start, today, DateField.DAY_OF_YEAR)
                .stream()
                .map(DateUtil::formatDate)
                .toList();

        // 调用 introductionService 的 selectAll 方法查询所有的 Introduction 对象
        // 传入一个空的 Introduction 对象作为查询条件，可能表示查询所有记录
        List<Introduction> introductions = introductionService.selectAll(new Introduction());

        // 遍历日期列表 xList
        for (String day : xList) {
            // 使用流操作过滤出 Introduction 对象列表中时间字段包含当前日期的对象，并统计数量
            long count = introductions.stream()
                    .filter(x -> ObjectUtil.isNotEmpty(x.getTime()) && x.getTime().contains(day))
                    .count();
            // 将统计的数量添加到 Y 轴数据列表 yList 中
            yList.add(count);
        }

        // 将日期列表 xList 作为 X 轴数据放入结果 Map 中
        resultMap.put("xAxis", xList);
        // 将每天的 Introduction 对象数量列表 yList 作为 Y 轴数据放入结果 Map 中
        resultMap.put("yAxis", yList);

        // 调用 Result 类的 success 方法，将结果 Map 封装成成功结果并返回
        return Result.success(resultMap);

    }
}
